/***********************************************************************************
 * 文件名： sled_ctrl_static.c
 * 版本： 3
 * 说明：
 * 		单色LED控制器。按照指令控制单色LED做一些动作。静态定义意味着只支持1个LED，多个LED
 *  暂不支持。
 *      在合适的地方调用 SLEDC_CtrlLoop 确保其间隔10ms左右会被执行一次，比如加入到
 *  Polsys_lite 的任务列表，如果使用的是 Polsys 就不需要再做这项工作，本文件已经创建了任务，
 *  但是需要在程序启动时调用 SLEDC_Init() 用于创建任务。
 *      通过 SLEDC_SetAction 设置动作， SLEDC_GetAction 可以获取当前的动作，一般用来判断
 *  是否为 SLEDC_ACT_NULL ，即是否空闲。
 *      在文件 SLED_ctrl_config.h 进行正确的配置。
 * 修改记录：
 * 	2022/04/01: 初版。 黄均铭。
 *  2022/04/02: 解决无法编译的BUG。 黄均铭。
 *  2022/05/30: 新增 _SLEDC_USE_GRA_TIME。刘言。
***********************************************************************************/
#include "sled_ctrl_static.h"
#include "..\..\polsys.h"

// 属性定义

static u8 SLEDC_mTime = 0;
static u8 SLEDC_mCount = 0;

sled_action_t _SLEDC_Action;
u8 _SLEDC_ActionValue;

// 定义一个任务，
#ifdef POLSYS_LITE
#else
static pdata polsys_task_t mTask;
#endif

// 内部函数申明

// 对外接口函数

#ifndef POLSYS_LITE
void SLEDC_CtrlLoop();
// 初始化
void SLEDC_Init()
{
    Polsys_TaskInit(&mTask, SLEDC_CtrlLoop, 10);
}
#endif

void SLEDC_SetAction(sled_action_t action, u8 action_value)
{
    _SLEDC_Action = action;
    _SLEDC_ActionValue = action_value;
    _SLEDC_EventActSetted();
}

// 任务入口：10ms循环执行
void SLEDC_CtrlLoop()
{
    if (_SLEDC_Action == SLEDC_ACT_ON)
    {
        if (_SLEDC_ActionValue > 0)
        {
            _SLEDC_ActionValue--;
            _SLEDC_SetBrightnessHook(255);
        }
        else
        {
            _SLEDC_Action = SLEDC_ACT_OFF;
        }
    }
    else if (_SLEDC_Action == SLEDC_ACT_OFF)
    {
        _SLEDC_SetBrightnessHook(0);
        _SLEDC_Action = SLEDC_ACT_WAIT;
    }
    else if (_SLEDC_Action == SLEDC_ACT_FLASH)
    {
        if (SLEDC_mTime < 20)
        {
            _SLEDC_SetBrightnessHook(0);
        }
        else if (SLEDC_mTime < 40)
        {
            _SLEDC_SetBrightnessHook(255);
        }
        else
        {
            SLEDC_mTime = 0;
            _SLEDC_ActionValue--;
            if (_SLEDC_ActionValue == 0)
                _SLEDC_Action = SLEDC_ACT_OFF;
        }
        SLEDC_mTime++;
    }
    // else if (_SLEDC_Action == SLEDC_ACT_FAST_FLASH)
    // {
    //     if (SLEDC_mTime < 10)
    //     {
    //         _SLEDC_SetBrightnessHook(0);
    //     }
    //     else if (SLEDC_mTime < 20)
    //     {
    //         _SLEDC_SetBrightnessHook(255);
    //     }
    //     else
    //     {
    //         SLEDC_mTime = 0;
    //         _SLEDC_ActionValue--;
    //         if (_SLEDC_ActionValue == 0)
    //             _SLEDC_Action = SLEDC_ACT_OFF;
    //     }
    //     SLEDC_mTime++;
    // }
    else if (_SLEDC_Action == SLEDC_ACT_GRA_ON)
    {
#ifdef _SLEDC_USE_GRA_TIME
        if (_SLEDC_ActionValue > 0) // 亮的时间
        {
            _SLEDC_ActionValue--;
#endif
            if (SLEDC_mCount < 250)
            {
                SLEDC_mCount += 5;
            }
            _SLEDC_SetBrightnessHook(SLEDC_mCount);
#ifdef _SLEDC_USE_GRA_TIME
        }
        else
        {
            _SLEDC_Action = SLEDC_ACT_GRA_OFF;
        }
#endif
    }
    else if (_SLEDC_Action == SLEDC_ACT_GRA_OFF)
    {
        if (SLEDC_mCount >= 5)
            SLEDC_mCount -= 5;
        else
        {
            _SLEDC_Action = SLEDC_ACT_OFF;
            SLEDC_mCount = 0;
        }
        _SLEDC_SetBrightnessHook(SLEDC_mCount);
    }
    else if (_SLEDC_Action == SLEDC_ACT_BREATH)
    {
        if (_SLEDC_ActionValue > 0)
        {
            _SLEDC_ActionValue--;
            if (SLEDC_mTime)
            {
                if (SLEDC_mCount <= 250)
                    SLEDC_mCount += 5;
                else
                    SLEDC_mTime = 0;
            }
            else
            {
                if (SLEDC_mCount >= 5)
                    SLEDC_mCount -= 5;
                else
                    SLEDC_mTime = 1;
            }
            _SLEDC_SetBrightnessHook(SLEDC_mCount);
        }
        else
        {
            _SLEDC_Action = SLEDC_ACT_GRA_OFF;
        }
    }
    else if (_SLEDC_Action == SLEDC_ACT_WAIT)
    {
        _SLEDC_Action = SLEDC_ACT_NULL;
        _SLEDC_EventActNull();
    }
    else
    {
        _SLEDC_Action = SLEDC_ACT_NULL;
        SLEDC_mCount = 0;
        SLEDC_mTime = 0;
    }
}
